import pandas as pd
import matplotlib.pyplot as plt
import os
import matplotlib as mpl

# 设置中文显示
plt.rcParams['font.sans-serif'] = ['SimHei']  # 使用黑体
plt.rcParams['axes.unicode_minus'] = False  # 解决负号显示问题
mpl.rcParams['font.size'] = 12  # 设置全局字体大小

# 读取数据
file_path = 'E:/M/MathModel/23国赛C题/ds/23年6月24到30.xlsx'
df = pd.read_excel(file_path)

# 计算利润并获取前27个单品
df['单品利润'] = (df['销售单价(元/千克)'] - df['批发价']) * df['销量(千克)']
profit_by_item = df.groupby('单品名称')['单品利润'].sum().reset_index()
top27_items = profit_by_item.sort_values('单品利润', ascending=False).head(27)['单品名称'].tolist()

# 筛选前27个单品的数据
df_top27 = df[df['单品名称'].isin(top27_items)]

# 转换销售日期为datetime类型并提取星期几
df_top27['销售日期'] = pd.to_datetime(df_top27['销售日期'])
df_top27['星期'] = df_top27['销售日期'].dt.day_name()
df_top27['日期'] = df_top27['销售日期'].dt.strftime('%m-%d')  # 简化为月-日格式

# 按日期和单品分组计算每日销量
daily_data = df_top27.groupby(['日期', '单品名称', '星期']).agg(
    总销量=('销量(千克)', 'sum')
).reset_index()

# 创建输出目录
output_dir = 'E:/M/MathModel/23国赛C题/ds/销售分析图表'
os.makedirs(output_dir, exist_ok=True)

# 创建销量趋势图
plt.figure(figsize=(18, 10))

# 为每个单品绘制销量折线
for item in top27_items:
    item_data = daily_data[daily_data['单品名称'] == item]
    plt.plot(item_data['日期'], item_data['总销量'], 'o-', linewidth=2, markersize=8, label=item)

# 添加周六周日标记
saturday_sunday = daily_data[daily_data['星期'].isin(['Saturday', 'Sunday'])]
sat_sun_dates = saturday_sunday['日期'].unique()

# 添加周末背景色
for date in sat_sun_dates:
    plt.axvspan(date, date, color='yellow', alpha=0.3, ymin=0, ymax=1)
    plt.text(date, plt.ylim()[1]*0.98, '周末',
             ha='center', va='top', fontsize=14,
             bbox=dict(facecolor='white', alpha=0.7))

# 添加标签和标题
plt.title('27个单品销量趋势 (2023年6月24日-30日)', fontsize=18, fontweight='bold')
plt.xlabel('日期', fontsize=14)
plt.ylabel('销量 (千克)', fontsize=14)
plt.xticks(fontsize=12)
plt.yticks(fontsize=12)
plt.grid(True, linestyle='--', alpha=0.7)

# 添加图例（放在图表右侧外部）
plt.legend(bbox_to_anchor=(1.05, 1), loc='upper left', fontsize=10, ncol=2)

# 添加数据标签（可选）
for item in top27_items:
    item_data = daily_data[daily_data['单品名称'] == item]
    last_point = item_data.iloc[-1]
    plt.text(last_point['日期'], last_point['总销量'], item,
             fontsize=8, ha='left', va='center')

plt.tight_layout()
plt.savefig(f'{output_dir}/27个单品销量趋势.png', dpi=300, bbox_inches='tight')
plt.show()

print(f"图表已保存至: {output_dir}/27个单品销量趋势.png")